﻿using Demo.Net.MongoDB;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Microsoft.Extensions.DependencyInjection
{

    public static class MongoDBComExtensions
    {
        private static IMongoDatabase mongoDatabase;
        public static IServiceCollection AddMongoDBStorage(this IServiceCollection services, IConfiguration configuration)
        {

            //单例生命周期：当将 MongoDB 服务注册为单例时，容器只会创建一个实例，并在整个应用程序的生命周期中重用该实例。这适合于全局共享的 MongoDB 连接或资源，在多个请求之间共享相同的连接对象。

            //作用域生命周期：当将 MongoDB 服务注册为作用域时，容器会在每个作用域（通常是 HTTP 请求）中创建一个新的实例，并在作用域内共享该实例。这适合于需要在每个请求或业务操作中使用新的 MongoDB 连接或资源。

            //瞬时生命周期：当将 MongoDB 服务注册为瞬时时，容器会在每次依赖注入时创建一个新的实例。这适合于需要临时使用 MongoDB 服务的情况，每次都获取一个新的连接或资源
            services.AddTransient(sp => {

                var mongoUrl = new MongoUrlBuilder(configuration["MongoConnectionString"])
                {
                    //数据库名称，如果连接字符串不指定
                    //DatabaseName = "test",
                    //MaxConnectionPoolSize = 20000, //最大链接数
                    //当客户端和服务器之间的连接一段时间没有活动时，服务器会将连接标记为"空闲"状态，并在一段时间后自动关闭连接。
                    MaxConnectionIdleTime = TimeSpan.FromSeconds(120),
                     //队列等待时间
                    WaitQueueTimeout = TimeSpan.FromSeconds(10),
                    //最大存活时间
                    MaxConnectionLifeTime = TimeSpan.FromSeconds(60 * 2)
                    
                };
                //获取数据库名称
                var databaseName = mongoUrl.DatabaseName;
                var mongoClient = new MongoClient(mongoUrl.ToMongoUrl());
                //删除数据库
                //mongoClient.DropDatabase();
              
                mongoDatabase = mongoClient.GetDatabase(databaseName);

                return mongoDatabase;
            });
            //注入MongoDataBase
            services.AddSingleton<MongoDBCom>();

            return services;
            
        }
    }
}
